<?php

function excel()
{
    $path = dirname(__FILE__);//找到当前脚本所在路径
    Loader::import('PHPExcel.Classes.PHPExcel');//手动引入PHPExcel.php
    Loader::import('PHPExcel.Classes.PHPExcel.IOFactory.PHPExcel_IOFactory');//引入IOFactory.php 文件里面的PHPExcel_IOFactory这个类
    $PHPExcel = new \PHPExcel();//实例化

    $PHPSheet = $PHPExcel->getActiveSheet();
    $PHPSheet->setTitle("demo");//给当前活动sheet设置名称
    $PHPSheet->setCellValue("A1","姓名")->setCellValue("B1","分数");//表格数据
    $PHPSheet->setCellValue("A2","张三")->setCellValue("B2","2121");//表格数据
    $PHPWriter = \PHPExcel_IOFactory::createWriter($PHPExcel,"Excel2007");//创建生成的格式
    header('Content-Disposition: attachment;filename="表单数据.xlsx"');//下载下来的表格名
    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    $PHPWriter->save("php://output");//表示在$path路径下面生成demo.xlsx文件
    return $this->fetch();
}



//ep:
    $xlsName = date("Y-m-d H-i"). "调拨数据";
    $cell_list = array(
        array('goodscode', '货号'),
        array('RFID', 'FRID'),
        array('name', '品名'),
        array('gstyle_name', '款号'),
        array('certno', '证书号'),
        array('totalweight', '总重(g)'),
        array('msct', '主石重（ct）'),
        array('salecut', '销售工费(件/克)'),
        array('outprice', '标签价'),
       
    );
    $goodslist = Db::name('shopbranch_body')->where(['billo_id'=>1])->select();
    exportExcel($xlsName, $cell_list, $goodslist);
/**
 * 导出数据
 * @param $expTitle //文件名
 * @param $expCellName //文件列名
 * @param $expTableData //文件数据
 * @autor pp
 */
function exportExcel($expTitle, $expCellName, $expTableData)
{

    $xlsTitle = iconv('utf-8', 'gb2312', $expTitle);//文件名称 将字符串从utf-8编码转为gb2312编码
    $fileName = $expTitle;//设置文件名称
    $cellNum = count($expCellName);//获取文件的列数
    $dataNum = count($expTableData);//获取数据的条数
    require '../extend/PHPExcel/Classes/PHPExcel.php';//导入PHPExcal类库

    $objPHPExcel = new \PHPExcel();//生成PHPExcel类实例

    $cellName = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
        'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH', 'AI', 'AJ', 'AK', 'AL', 'AM', 'AN', 'AO', 'AP', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AV', 'AW', 'AX', 'AY', 'AZ',
        'BA', 'BB', 'BC', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BK', 'BL', 'BM', 'BN', 'BO', 'BP');
    $objPHPExcel->getProperties()->setCreator("Sam.c")//设置文档属性作者
    ->setLastModifiedBy("Sam.c Test")//设置最后修改人
    ->setTitle("Microsoft Office Excel Document")//设置文档属性标题
    ->setSubject("Test0")//设置文档属性文档主题
    ->setDescription("Test1")//设置文档属性备注
    ->setKeywords("Test2")//设置文档属性关键字
    ->setCategory("Test result file");//设置文档属性类别

    for ($i = 0; $i < $cellNum; $i++) {

        $objPHPExcel->getActiveSheet()->getStyle($cellName[$i] . '1')->getFont()->setBold(true)->setSize(13);
        $objPHPExcel->setActiveSheetIndex(0)->setCellValueExplicit($cellName[$i] . '1', $expCellName[$i][1]);
        $objPHPExcel->getActiveSheet()->getColumnDimension($cellName[$i])->setWidth(12);
    }

    //让总循环次数小于数据条数
    for ($i = 0; $i < $dataNum; $i++) {
        //让每列的数据数小于列数
        for ($j = 0; $j < $cellNum; $j++) {
            //设置单元格的值
            $objPHPExcel->getActiveSheet(0)->setCellValueExplicit($cellName[$j] . ($i + 2), $expTableData[$i][$expCellName[$j][0]], PHPExcel_Cell_DataType::TYPE_STRING)->getStyle($cellName[$j] . ($i + 2), $expTableData[$i][$expCellName[$j][0]])->getFont()->setSize(12);
        }
    }

    ob_end_clean();//清除缓冲区,避免乱码
    header('pragma:public');
    header('Content-type:application/vnd.ms-excel;charset=utf-8;name="' . $xlsTitle . '.xlsx"');
    header("Content-Disposition:attachment;filename=$fileName.xlsx");//attachment新窗口打印inline本窗口打印
    $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
    $objWriter->save('php://output');

    exit;
}



/**
 * 数据转csv格式的excle
 * @param  array $data      需要转的数组
 * @param  string $header   要生成的excel表头
 * @param  string $filename 生成的excel文件名
 *      示例数组：
        $data = array(
            '1,2,3,4,5',
            '6,7,8,9,0',
            '1,3,5,6,7'
            );
        $header='用户名,密码,头像,性别,手机号';
 */
function create_csv($data,$header=null,$filename='simple.csv'){
    // 如果手动设置表头；则放在第一行
    if (!is_null($header)) {
        array_unshift($data, $header);
    }
    // 防止没有添加文件后缀
    $filename=str_replace('.csv', '', $filename).'.csv';
    ob_clean();
    Header( "Content-type:  application/octet-stream ");
    Header( "Accept-Ranges:  bytes ");
    Header( "Content-Disposition:  attachment;filename=".$filename);
    foreach( $data as $k => $v){
        // 如果是二维数组；转成一维
        if (is_array($v)) {
            $v=implode(',', $v);
        }
        // 替换掉换行
        $v=preg_replace('/\s*/', '', $v);
        // 解决导出的数字会显示成科学计数法的问题
        $v=str_replace(',', "\t,", $v);
        // 转成gbk以兼容office乱码的问题
        echo iconv('UTF-8','GBK',$v)."\t\r\n";
    }
}


/**
 * 函数描述 导入数据
 * @param $file_name //文件名
 * @param $filedsList //需要导入保存的字段列表 array
 * @param $cellList //列名列表 array
 * @return array|string
 * @autor pp
 */
function importExcel($file_name, $filedsList = array(), $cellList = array())
{

    require '../extend/PHPExcel/Classes/PHPExcel.php';
    $info = pathinfo($file_name);

    //文件名为文件路径和文件名的拼接字符串
    if ($info['extension'] == "xlsx") {
        $objReader = \PHPExcel_IOFactory::createReader('Excel2007');//创建读取实例
        //$objReader->setReadDataOnly(true);
    } else {
        $objReader = \PHPExcel_IOFactory::createReader('Excel5');//创建读取实例
        //$objReader->setReadDataOnly(true);
    }
    // $objReader = \PHPExcel_IOFactory::createReader('Excel5');//创建读取实例

    $objPHPExcel = $objReader->load($file_name, $encode = 'utf-8');//加载文件
    $sheet = $objPHPExcel->getSheet(0);//取得sheet(0)表
    $highestRow = $sheet->getHighestRow(); // 取得总行数
    $highestColumn = $sheet->getHighestColumn();

    if ($cellList[count($filedsList) - 1] != $highestColumn) {
        return '';
    }
    $data = array();
    for ($i = 0; $i < $highestRow - 1; $i++) {
        //让每列的数据数小于列数
        for ($j = 0; $j < count($cellList); $j++) {
            $data[$i][$filedsList[$j]] = $objPHPExcel->getActiveSheet()->getCell($cellList[$j] . ($i + 2))
                ->getFormattedValue();
            if (is_object($data[$i][$filedsList[$j]])) $data[$i][$filedsList[$j]] = $data[$i][$filedsList[$j]]->__toString();//报错
            $data[$i][$filedsList[$j]] = preg_replace("/(\s|\&nbsp\;|　|\xc2\xa0)/", "", $data[$i][$filedsList[$j]]);
            //去空格
        }

    }
    return $data;
}